#include "volumebutton.h"

#include <QtWidgets>
#include <QtWinExtras>
#include <QDebug>

// 音量按钮
VolumeButton::VolumeButton(QWidget *parent) :
    QToolButton(parent)
{
    setIcon(style()->standardIcon(QStyle::SP_MediaVolume));
    setPopupMode(QToolButton::InstantPopup);

    QWidget *popup = new QWidget(this);

    slider = new QSlider(Qt::Horizontal, popup);
    slider->setRange(0, 100);
    // 信号->信号
    connect(slider, &QAbstractSlider::valueChanged, this, &VolumeButton::volumeChanged);

    label = new QLabel(popup);
    label->setAlignment(Qt::AlignCenter);
    label->setNum(100);
    label->setMinimumWidth(label->sizeHint().width());

    // QOverload::of(&QLabel::setNum)是用于解决函数重载的模板函数。在这个例子中，我们指定了setNum函数的参数类型为int，以确保正确匹配信号的参数类型和槽函数的参数类型。
    // void setNum(double num)
    // void setNum(int num)

    connect(slider, &QAbstractSlider::valueChanged, label, QOverload<int>::of(&QLabel::setNum));

    QBoxLayout *popupLayout = new QHBoxLayout(popup);
    popupLayout->setMargin(2);
    popupLayout->addWidget(slider);
    popupLayout->addWidget(label);

    auto *action = new QWidgetAction(this);
    action->setDefaultWidget(popup); // 小部件设置为默认的小部件

    // 为按钮添加右键菜单
    menu = new QMenu(this);
    menu->addAction(action);
    setMenu(menu);

    stylize();
}

// 音量加
void VolumeButton::increaseVolume()
{
    qDebug()<<"increaseVolume++";
    slider->triggerAction(QSlider::SliderPageStepAdd);
}
// 音量减
void VolumeButton::descreaseVolume()
{
    qDebug()<<"descreaseVolume--";
    slider->triggerAction(QSlider::SliderPageStepSub);
}

// 音量当前值
int VolumeButton::volume() const
{
    return slider->value();
}

// 设置音量值
void VolumeButton::setVolume(int volume)
{
    slider->setValue(volume);
}

//! [这段代码的作用是根据当前操作系统的版本和桌面合成功能的状态来设置音量按钮控件的样式。如果当前操作系统为Windows 7，并且桌面合成功能已启用，
//! 则菜单将具有特定的边框和透明背景样式。否则，菜单将具有不同的边框和背景颜色样式。]
void VolumeButton::stylize()
{
    // 获取当前操作系统的版本信息
    if (QOperatingSystemVersion::current() < QOperatingSystemVersion::Windows8) {
        // 设置仅与windows 7相关的样式选项。
        if (QtWin::isCompositionEnabled()) {    // 检查Windows的桌面合成功能是否启用
            QtWin::enableBlurBehindWindow(menu);    // 为菜单（menu）启用窗口背后的模糊效果
            QString css("QMenu { border: 1px solid %1; border-radius: 2px; background: transparent; }");
            menu->setStyleSheet(css.arg(QtWin::realColorizationColor().name()));
        } else {
            QtWin::disableBlurBehindWindow(menu);   // 禁用菜单的窗口背后模糊效果
            QString css("QMenu { border: 1px solid black; background: %1; }");
            menu->setStyleSheet(css.arg(QtWin::realColorizationColor().name()));
        }
    }
}
//! [end]
